#include "resolver.h"
#include <iterator>
#include <iostream>
#include <time.h>

using namespace std;

static void dfs(int nodo, const Grafo & grafo, 
			vint & visitado, vint & compo){

	visitado[nodo] = true;

	const vint & vecino = grafo.vecinos(nodo);
	int vecinos = vecino.size();
	
	for(int i = 0; i < vecinos; i++){
		int v = vecino[i];
		if(!visitado[v]){	
			compo.push_back(v);
			visitado[v] = true;
			dfs(v,grafo,visitado,compo);
		}
	} 

}

vint resolver(const Grafo & grafo, Metodo metodo, long & timer){
	timer = clock();

	vint resultado;
	vint visitado(grafo.nodos(),false);

	for(int i = 0; i < grafo.nodos(); i++){
		if(!visitado[i]){
			vint compo;
			compo.push_back(i);
						
			dfs(i,grafo,visitado,compo);
			const vint & dominaCompo = metodo(grafo,compo);

			timer += dominaCompo.size();
			copy(dominaCompo.begin(),
				dominaCompo.end(),back_inserter(resultado));
		}
	}
	
	timer = clock()-timer;
	return resultado;
}
